var KmcEnv = require('./kmc-env');
var KmcLocalStorageFunction = require('./kmc-localStorageFunction');
var KmcCommonFunc = require('./kmc-commonFunction');

/**
 * 设置是否开启H5端的数据埋点
 * @param isTrackData false表示关闭
 */
window.yt_setTrackData = function(isTrackData){
    KmcLocalStorageFunction.setLocalData("isTrackData", isTrackData);
}

window.handleKeyBoard = null;

// 当前页面类型：普通交易/融资融券，默认为普通交易
window.type = document.body == undefined ? "" : (document.body.getAttribute("data-ywlx") || "ptjy");

// 需要保存到 APP 里的本地存储的键
window.appKey = ["ptjyLszhList", "rzrqLszhList", "ptjyJZZH", "rzrqJZZH", 'trade_login_default_key"'];

/*--------------------Begin: H5供原生调用的方法--------------------*/

/**
 * 键盘回调方法     [与APP交互使用,函数名不能随意修改]
 * @param {String} data  回显的文字
 * @param {String} jysdm 交易所代码（键盘精灵回传）
 */
window.fillInputContent = function (data, jysdm) {
    console.log("fillInputContent >> stockCode=" + data + " jysdm=" + jysdm);
    window.handleKeyboard(data, jysdm);
};

window.handlePageBack = function() {};

window.setPageHeight = function() {
    let height = document.documentElement ? document.documentElement.clientHeight : window.innerHeight;
    if (height !== 0 || height) {
        KmcLocalStorageFunction.setLocalData('pageHeight', height);
    } else {
        // location.reload();
    }
};

window.getPageHeight = function() {
    let height = document.documentElement ? document.documentElement.clientHeight : window.innerHeight;
    if(height === 0 || !height) {
        height = KmcLocalStorageFunction.getLocalData('pageHeight');
    }
    return height;
};

/**
 * 设置App的主题皮肤    [与APP交互使用,函数名不能随意修改]
 * @param {String} name 主题的名称（暂只支持 black和white）
 */
window.setAppTheme = function (name) {
    document.documentElement.setAttribute("apptheme", name);
    KmcLocalStorageFunction.setLocalData("AppTheme", name);
}

/**
 * 设置注册 [与APP交互使用,函数名不能随意修改]
 * @param {String} phone 手机号码
 */
window.setIsRegister = function (phone) {
    KmcLocalStorageFunction.setLocalData("cellPhoneNumber", phone);
}

/**
 * 设置留痕信息 [与APP交互使用,函数名不能随意修改]
 * @param {String} obj 留痕信息
 * @param {String} objNew V2.0新增留痕信息
 */
window.setMarkInfo = function (obj, objNew) {
    KmcLocalStorageFunction.setLocalData("lhxx", obj);
    /*
    * 代码作用：网络留痕升级，服务器新增lhxxn，lhxxn由原生APP传入
    * 解决人：xiaoxin.qiao
    * 解决日期：2019/1/31
    * jira工单：BBDD-698
    */
    if (objNew) {
        KmcLocalStorageFunction.setLocalData("lhxxn", objNew);
    }
}

/**
 * 清除登录信息 [与APP交互使用,函数名不能随意修改]
 */
window.ClearLoginInfo = function (ywlx) {
    if (ywlx == undefined || ywlx == null) {
        ywlx = window.type;
    }
    KmcCommonFunc.clearLoginInfo(ywlx);
}

/**
 * 设置 App 版本号  [与APP交互使用,函数名不能随意修改]
 * @param {String} version 版本号
 */
window.setAppVersion = function (version) {
    KmcLocalStorageFunction.setLocalData("appversion", version + "");
    KmcCommonFunc.clearUnusedLoginLocalData();//清除上次登录的多账户登录的标志
}

/**
 *设置本地存储数据  [与APP交互使用,函数名不能随意修改]
 * @param {String} key   键名
 * @param {String} value 键值
 * @param {Number} from  来源 0: android 1: ios
 */
window.setLocalData = function (key, value, from) {
    value = typeof (value) == "string" ? value : JSON.stringify(value);
    KmcLocalStorageFunction.setLocalData(key, value);
    // 非 APP 调用该接口时, 需要把特殊键值保存到APP里去.
    if (from == undefined && window.appKey.indexOf(key) > -1) {
        kmcInteraction.saveOrUpdateLocalData(key, value);
    }
}

/**
 * 获取登录账号  [与APP交互使用,函数名不能随意修改]
 * @return 登录成功返回“资金账号”， 没有登录返回空字符串
 */
window.getLoginAccount = function (ywlx) {
    ywlx = ywlx == undefined ? "ptjy" : ywlx;
    var _tmp = ywlx == "ptjy" ? "ActivePTJYUser" : "ActiveRZRQUser";

    var khbs = "";
    if (KmcLocalStorageFunction.getLocalData(_tmp)) {
        //登录时入参
        var ActiveUse = KmcLocalStorageFunction.getLocalData(_tmp);
        // 登录后返回的资金账号
        khbs = ActiveUse['body'].dlxx[0].zjzh;

    }
    if (KmcEnv.platform.isAndroid) {
        kmcInteraction.onLoginAccount(khbs);
        return;
    }

    return khbs;
}

/**
 *    快捷跳转页面    [与APP交互使用,函数名与viewKey值不能随意修改]
 *    @param viewKey    目的页面对应键
 *    @param zqdm    买入卖出页面需要传递股票代码
 *    @param jysdm   交易所代码
 */
window.jumpToView = function (viewKey, zqdm, jysdm) {

}

/**
 * 接收从原生回传的特定功能所需要的参数，与getNativeFunction成对使用    [与APP交互使用,函数名与viewKey值不能随意修改]
 * 这是一个通用方法，根据 functionKey 来区分功能，jsonStr 动态传参
 * @param functionKey    业务功能号
 * @param jsonStr    回传的参数
 */
window.callNativeFunction = function (functionKey, jsonStr) {
    // 在具体页面中使用
}

/**
 * 设置App的字体大小
 * @param size 字体的大小 normal-标准字体  big-大字体
 */
window.setAppFont = function (size) {
    document.documentElement.setAttribute("appsize", size);
    KmcLocalStorageFunction.setLocalData("AppSize", size);
}

/**
 * 初始化App字体大小
 */
function initialAppFont() {
    var size = KmcLocalStorageFunction.getLocalData("AppSize");
    document.documentElement.setAttribute("appsize", size);
}

window.setOpenState = function() {
    /* 按照最新的技术文档优化setOpenState，可以在6.10.2版本后删除旧版本 */
    let state = 1;
    let functionCode = '';
    let result = {};

    // new（一个参数）
    console.log(Object.prototype.toString.call(arguments[0]));
    if (arguments.length === 1 && Object.prototype.toString.call(JSON.parse(arguments[0])) === '[object Object]') {
        let parameters = JSON.parse(arguments[0]);
        state = parameters.state;
        functionCode = parameters.functionCode;
        result = parameters.result;
    }

    // old（三个参数）
    if (arguments.length === 3) {
        state = Number(arguments[0]);
        functionCode = arguments[1];
        result = arguments[2];
    }

    switch (state) {
        case 1:
            console.log('success: 成功');
            if (Object.prototype.toString.call(result) === '[object String]') {
                result = JSON.parse(result);
            }
            setTradeOpenState(functionCode, result);
            break;
        case 2:
            console.log('error: 功能号不存在');
            break;
        case 3:
            console.log('error: 传参错误');
            break;
        case 4:
            console.log('error: 其他异常错误');
            break;
        default:
            console.log(`error: 状态码${state}未定义`);
            break;
        }
}

/*--------------------End: H5供原生调用的方法--------------------*/

var kmcInteraction = {

    /*--------------------Begin: H5调用原生的请求--------------------*/

    /**
     *    URL 跳转界面
     *    @param url    url地址
     *    @param hasRefresh    标识有无刷新按钮 0：显示，4：隐藏(占空间),8:隐藏(不占空间)
     *    @param direction    1：下一级界面；-1：返回上一级界面  0：在原生覆盖掉当前页面  -100：直接成为顶层页面 -2：返回上一级页面且不刷新上一个页面的数据
     */
    switchWebView: function (url, hasRefresh, direction, handlePageBack) {
        console.log("KmcEnv.platform.isBrower", KmcEnv.platform.isBrower);
        if (handlePageBack) {
            window.handlePageBack = handlePageBack;
        }
        if (KmcEnv.platform.isPhone) {
            // if(!KmcEnv.platform.isBrower){
            // 未传第2个参数时默认为0
            hasRefresh = hasRefresh == undefined ? 0 : hasRefresh;
            // 未传第3个参数时默认为1
            direction = direction == undefined ? 1 : direction;
            // hasRefresh 参数值不是数字，使用默认值 0
            hasRefresh = !isNaN(hasRefresh) ? parseInt(hasRefresh) : 0;
            // direction 参数值不是数字，使用默认值 1
            direction = !isNaN(direction) ? parseInt(direction) : 1;

            this.sendInteraction("switchWebView", [url, hasRefresh, direction]);
        } else {
            url = this.getFirstHref() + url;
            console.log("跳转地址：" + url);
            // 平级页面之间的跳转
            if (direction == 0) {
                location.replace(url)
            } else if (direction == -1) {
                history.back();
            } else {
                location.href = url;
            }
        }
    },

    /**
     *    显示键盘
     *    @param        id    触发显示键盘事件的文本框ID
     *    @param        type    键盘类型    1.纯数字键盘,2.带小数点的数字键盘,3.数字字母切换键盘,4.纯字母键盘,10.键盘精灵 ;
     */
    showKeyBoard: function (id, type, handleKeyBoardClick) {
        window.handleKeyboard = handleKeyBoardClick;

        if (id == undefined) {
            console.log("文本输入框 id 不能为空!");
            return;
        }
        var inputObj = document.getElementById(id);
        if (inputObj.length == 0) {
            console.log("文本输入框 id 不存在! id=" + id);
            return;
        } else {
            console.log("文本输入框 id=" + id);
        }
        inputObj.focus();
        if (type == undefined) {
            console.log("键盘类型不存在!");
            return;
        }
        var rect = inputObj.getBoundingClientRect();
        var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
        var X = rect.left;
        var Y = rect.top + scrollTop;
        Y += inputObj.offsetHeight;            // 加上文本框高度
        Y += 80;                            // 额外加 80 像素, 可以显示出下一个输入框或按钮
        // 系数 = 输入框底部到页面顶部的高度 / 页面可见区域高度
        if (KmcEnv.platform.isAndroid) {
            var clientHeight = window.document.body.clientHeight;
            var availHeight = screen.availHeight;
            console.log("Y:" + Y + " clientHeight:" + clientHeight + " availHeight:" + availHeight);
            var height = clientHeight;
            //屏幕高度取两者最大值
            if (clientHeight < availHeight) {
                height = availHeight;
            }
            Y = Y / height;
        }
        this.sendInteraction("showKeyBoard", [type, Y]);
    },

    //隐藏自定义键盘
    hideKeyBoard: function () {
        this.sendInteraction("hideKeyBoard");
    },

    //保存数据到本地
    saveOrUpdateLocalData: function (key, value) {
        this.sendInteraction("saveOrUpdateLocalData", [key, value]);
    },

    //返回当前登录的资金账号
    onLoginAccount: function (loginAccount) {
        this.sendInteraction("onLoginAccount", [loginAccount]);
    },

    //记录日志
    //提示：由于IOS平台限制，该方法需在页面跳转之后调用，否则会阻止页面跳转
    log: function (content) {
        this.sendInteraction("log", [content]);
    },

    //显示日期控件
    showDateDialog: function (time, min, max, method) {
        this.sendInteraction("showDateDialog", [time, min, max, method]);
    },

    /**
     * 重构webview的高度以适配页面高度的变化
     * @param isExpand 页面是否处于展开模式 1：是， 0：否
     */
    resizeWebView: function (callBackMethod, isExpand) {
        var mehtodName = "";

        if (callBackMethod) {
            mehtodName = "callBackMethod";
            window.callBackMethod = callBackMethod;
        }

        this.sendInteraction("resizeWebView", [isExpand]);
    },

    /**
     * Javascript语言
     * 通知iPhone UIWebView 加载url对应的资源
     * @param url
     */
    loadURL: function (url) {
        var iFrame;
        iFrame = document.createElement("iframe");
        iFrame.setAttribute("src", url);
        iFrame.setAttribute("style", "display:none;");
        iFrame.setAttribute("height", "0px");
        iFrame.setAttribute("width", "0px");
        iFrame.setAttribute("frameborder", "0");
        document.body.appendChild(iFrame);
        // 发起请求后这个iFrame就没用了，所以把它从dom上移除掉
        iFrame.parentNode.removeChild(iFrame);
        iFrame = null;
    },

    /**
    *函数功能： openAppService 调用原生方法跳转到其他第三方（与原生进行交互）
    * openSource    业务源，记录跳转的来源，方便追踪业务调试及权限控制，要求字母全大写
    * openType      业务跳转或交互类型 （）
    * functionCode  确认原生跳转类型的业务跳转页面
    * param         给三方业务传参，不需要时可以传””。值的格式为json如：{“stockCode”:”000728”}
    * 新协议
    * */
    openAppService: function(openSource, openType, functionCode, param) {
        this.sendInteraction("openService", [openSource, openType, functionCode, param]);
    },

    /**
     * 函数功能：回调 APP 方法（与原生进行交互）
     * 这是一个通用方法，根据 functionKey 来区分功能，jsonStr 动态传参
     * @param  {[type]} functionKey [功能KEY]
     * @param  {[type]} jsonStr     [JSON 字符串对象]
     */
    callbackTradeFunction: function (functionKey, jsonStr) {
        console.log(['callbackTradeFunction', functionKey, jsonStr].join(","));
        this.sendInteraction("callbackTradeFunction", [functionKey, jsonStr]);
    },

    /**
     * 当调用 jumpToView 时，传入的 KEY 值是闪电买卖值，登录完成后，则回调该方法（与原生进行交互）
     * @param  {[type]} functionKey [功能 KEY 值]
     */
    callbackJumpToView: function (functionKey) {
        this.sendInteraction("callbackJumpToView", [functionKey]);
    },

    /**
     * 函数功能：从原生获取某功能需要的参数（与原生进行交互）
     * 这是一个通用方法，根据 functionKey 来区分功能，jsonStr 动态传参
     * @param  {[type]} functionKey [功能KEY]
     * @param  {[type]} jsonStr     [JSON 字符串对象]
     */
    getNativeFunction: function(functionKey, jsonStr) {
        this.sendInteraction("getNativeFunction", [functionKey, jsonStr]);
    },

    /*--------------------End: H5调用原生的请求--------------------*/

    /**
     * 发送与原生接口的交互请求
     * @param  {String} methodName 方法名
     * @param  {Array} parameters 参数数组
     */
    sendInteraction: function (methodName, parameters) {
        // 判断如果是 PC, 则不处理
        if (KmcEnv.platform.isBrower) {

        }
        //判断如果是IOS平台则发送IOS请求，是Android平台则发送Android请求
        else if (KmcEnv.platform.isAndroid) {
            if (methodName == "log") {
                console.log.apply(console, parameters);
            } else {
                // Android 平台
                KDS_Native[methodName].apply(KDS_Native, parameters);
            }
        } else if (KmcEnv.platform.isPhone) {
            //IOS 平台
            //组装方法
            // 如果是openService或setShowMode方法，要对每个参数的冒号进行替换
            if (methodName == "openService" || methodName == "setShowMode" || methodName == "getNativeFunction") {
                if (parameters) {
                    for (var i = 0; i < parameters.length; i++) {
                        parameters[i] = this.replaceStr(parameters[i]);
                    };
                }
            }
            var iosMethod = "KDS_Native://" + methodName;

            //组装参数
            var iosParams = "";
            if (parameters) {
                for (var i = 0; i < parameters.length; i++) {
                    iosParams += ":" + parameters[i];
                };
            }

            //与IOS端交互
            this.loadURL(iosMethod + iosParams);
            // location.href = iosMethod + iosParams;
        }
    },

    /**
     * 函数功能：获取当前URL地址前半部分
     */
    getFirstHref: function () {
        var _url = window.location.href;
        var _index = _url.indexOf("views/");
        _url = _url.substring(0, _index + 6);
        return _url;
    },

    /**
     * 函数功能：获取当前URL地址后半部分
     */
    getLastHref: function () {
        var _url = window.location.href;
        var _index = _url.indexOf("view/");
        _url = _url.substring(_index + 5);
        return _url;
    },

    /**
    * 函数功能： replaceStr 把字符串中的“：”替换成“%3A”（与iOS交互时，参数中含有冒号的需用%3A替换冒号，否则被自动分割）
    */
    replaceStr: function(str) {
        return str.replace(/:/g, "%3A")
    },

    /**
     * 大智慧版本获取股东账号、资金账号
     * ywlx: 0-ptjy, 1-rzrq
     */
    getLoginAccountInfo: function (ywlx) {
        this.sendInteraction("getLoginAccountInfo", [ywlx]);
    },

    /**
     * 获取个股详情股票信息
     */
    getStockDetailCodeData: function () {
        this.sendInteraction("getStockDetailCodeData");
    },

    /**
     * 获取商户密钥-个股详情发现页
     */
    getLCSCMerchantID: function () {
        this.sendInteraction("getLCSCMerchantID");
    },

    /**
     * 获取中台下发灰度值和灰度标识
     */
    getNewVersionFlag: function() {
        this.sendInteraction("getNewVersionFlag");
    },

    /**
     * 时间戳格式化
     */
    crtTimeFtt(val, model) {
        if (val != null) {
            let date = new Date(val);
            date.setHours(date.getHours() + 8);
            let year = date.getUTCFullYear();
            let month = date.getUTCMonth() + 1;
            let day = date.getUTCDate();
            let hour = date.getUTCHours();
            let minute = date.getUTCMinutes();
            let second = date.getUTCSeconds();
            if (model == '0') {
                return year + '年' + month + '月';
            } else if (model == '1') {
                if (month < 10) {
                    return year + '0' + month;
                } else {
                    return year + '' + month;
                }
            } else if (model == '2') {
                month = month < 10 ? '0' + month : month;
                day = day < 10 ? '0' + day : day;
                hour = hour < 10 ? '0' + hour : hour;
                minute = minute < 10 ? '0' + minute : minute;
                second = second < 10 ? '0' + second : second;
                return year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second;
            } else if (model == '3') {
                month = month < 10 ? '0' + month : month;
                day = day < 10 ? '0' + day : day;
                hour = hour < 10 ? '0' + hour : hour;
                minute = minute < 10 ? '0' + minute : minute;
                second = second < 10 ? '0' + second : second;
                return year + '年' + month + '月' + day + '日';
            } else if (model == '4') {
                return year + '年' + month + '月' + day + '日';
            }
        }
    }
};

module.exports = kmcInteraction;
